#include <stdio.h>
#include <stack>
#include <string.h>
#include <iostream>
#define ID 0 /// digit 也是
#define DIGIT 0
#define AD 1
#define MU 2
#define LB 3
#define RB 4
#define END 5
#define WE 6
#define WT 7
#define WF 8
using namespace std ;

static int id_val = -1; ///记录当前数字ID的val表项 ;

struct node{
	int x,y ;
	node() {
		x = -1 ; y = -1 ;
	}
	void set(int a,int b) {
		x = a ; y = b ;
	}
}Tab[100][100];
int text[10] = {0 , 3 , 1 , 3 , 1 , 3 , 1} ;
int des[10] = {0 , WE , WE , WT , WT , WF , WF} ;
char str[10][20] = {{} , {"E -> E + T"} , {"E -> T"} , {"T -> T * F"} , {"T -> F"} , {"F -> (E)"} , {"F -> id"}} ;
void pre(){
	Tab[0][ID].set('s' , 5) ; Tab[1][AD].set('s' , 6) ;
	Tab[0][LB].set('s' , 4) ; Tab[1][END].set('a' , 0) ;
	Tab[2][AD].set('r' , 2) ; Tab[2][MU].set('s' , 7) ; Tab[2][RB].set('r' , 2) ; Tab[2][END].set('r' , 2) ;
	Tab[3][AD].set('r' , 4) ; Tab[3][MU].set('r' , 4) ; Tab[3][RB].set('r' , 4) ; Tab[3][END].set('r' , 4) ;
	Tab[4][ID].set('s' , 5) ; Tab[4][LB].set('s' , 4) ;
	Tab[5][AD].set('r' , 6) ; Tab[5][MU].set('r' , 6) ; Tab[5][RB].set('r' , 6) ; Tab[5][END].set('r' , 6) ;
	Tab[6][ID].set('s' , 5) ; Tab[6][LB].set('s' , 4) ;
	Tab[7][ID].set('s' , 5) ; Tab[7][LB].set('s' , 4) ;
	Tab[8][AD].set('s' , 6) ; Tab[8][RB].set('s' , 11) ;
	Tab[9][AD].set('r' , 1) ; Tab[9][MU].set('s' , 7) ; Tab[9][RB].set('r' , 1) ; Tab[9][END].set('r' , 1) ;
	Tab[10][AD].set('r' , 3) ; Tab[10][MU].set('r' , 3) ;Tab[10][RB].set('r' , 3) ; Tab[10][END].set('r' , 3) ;
	Tab[11][AD].set('r' , 5) ; Tab[11][MU].set('r' , 5) ;Tab[11][RB].set('r' , 5) ; Tab[11][END].set('r' , 5) ;

	///
	Tab[0][WE].set('s' , 1) ;Tab[0][WT].set('s' , 2) ;Tab[0][WF].set('s' , 3) ;
	Tab[4][WE].set('s' , 8) ;Tab[4][WT].set('s' , 2) ;Tab[4][WF].set('s' , 3) ;
	Tab[6][WT].set('s' , 9) ;Tab[6][WF].set('s' , 3) ;
	Tab[7][WF].set('s' , 10) ;
}
char input[10000] ;
int len , pt ;
stack <int> stk ;
stack <int> val ; ///新增属性栈
///新增这一个属性计算就可以了
void deal_val(int type){
    if(type == 1){
        int a2 = val.top() ; val.pop() ;
        int a1 = val.top() ; val.pop() ;
        int ans = a1 + a2 ;
        val.push(ans) ;
    }
    else if(type == 2){
        int a1 = val.top() ; val.pop() ;
        int ans = a1 ;
        val.push(ans) ;
    }
    else if(type == 3){
        int a2 = val.top() ; val.pop() ;
        int a1 = val.top() ; val.pop() ;
        int ans = a1 * a2 ;
        val.push(ans) ;
    }
    else if(type == 4){
        int a1 = val.top() ; val.pop() ;
        int ans = a1 ;
        val.push(ans) ;
    }
    else if(type == 5){
        int a1 = val.top() ; val.pop() ;
        int ans = a1 ;
        val.push(ans) ;
    }
    else if(type == 6){
        val.push(id_val) ;
    }
}
int get_id(char k){
	if(k == '+') return AD;
	if(k == '*') return MU ;
	if(k>='0' && k<='9') {
	    id_val = k - '0' ;
        return ID ; ///默认只可以处理一个数字。
	}
	if(k=='@') {
        return ID ; ///默认只可以处理一个数字。
	}
	if(k == '(') return LB ;
	if(k == ')') return RB ;
	if(k == '\n') return END; ///改变了， \n是终结符。
}
bool work(){
	while(!stk.empty()) stk.pop() ;
	len = 0 ; pt = 0 ;
	len = strlen(input) ;
	input[len] = '\n' ;
	len ++ ;
	int tx = 0 ;
	int ty = 0 ;
	stk.push(0) ;
	while(1){
		///printf("pt = %d yes\n" , pt) ;
		printf("%s\n" , input+pt) ;
		///getchar() ;
		if(pt >= len) return 0 ;
		int id = get_id(input[pt]) ;
		int top = stk.top() ;
		tx = Tab[top][id].x ;
		ty = Tab[top][id].y ;
		if(tx == 'a') {
			pt ++ ;
			printf("表达式s属性:\n%d\n" , val.top()) ;
			break ;
		}
		else if(tx == 's') {
		    ///printf("s ---> \n") ;
			pt ++ ; stk.push(id) ; stk.push(ty) ;
		}
		else if(tx == 'r'){
		    ///printf("r ---> \n") ;
			int tmp = text[ty] ;
			while(tmp --) stk.pop() , stk.pop() ;
			int top = stk.top() ;
			stk.push(des[ty]) ;
			stk.push(Tab[top][des[ty]].y) ;

			deal_val(ty) ;

			cout << str[ty] << endl ;
		}
		else break ;
	}
	if(pt == len) return 1 ;
	else return 0 ;
}
int main(){
	pre() ;
	///freopen("input.txt" ,"r" ,stdin) ;
	scanf("%s" , input) ;
	cout << input << endl ;
	int res = work() ;
	if(res == 1) printf("yes\n") ;
	else printf("No\n") ;
}
